#ifndef RWLOCK_FREERTOS_H
#define RWLOCK_FREERTOS_H
#ifndef CONFIG_FREERTOS_MAX_TASK_NAME_LEN
#define CONFIG_FREERTOS_MAX_TASK_NAME_LEN 16
#endif
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
/* 基于 FreeRTOS 的读写锁实现 */
/* 读写锁是一种多线程同步机制，允许多个线程同时对共享资源进行读操作，但只允许一个线程对共享资源进行写操作。 */
typedef struct
{
    SemaphoreHandle_t read_mutex;  // 读锁互斥信号量
    SemaphoreHandle_t write_mutex; // 写锁互斥信号量
    volatile int readers_count;    // 当前读者数量
    int initialized;               // 是否被初始化
    int destroyed;                 // 是否被销毁
} rwlock_t;
#define RWLOCK_INITIALIZER {NULL, NULL, 0, 0, 0}
#endif

#ifdef __cplusplus
extern "C"
{
#endif

    /* 读写锁初始化 */
    void rwlock_init(rwlock_t *lock);
    /* 读写锁销毁 */
    void rwlock_destroy(rwlock_t *lock);
    /* 读写锁的读取锁加锁 */
    void rwlock_lock_read(rwlock_t *lock);
    /* 读写锁的读取锁解锁 */
    void rwlock_unlock_read(rwlock_t *lock);
    /* 读写锁的写入锁加锁 */
    void rwlock_lock_write(rwlock_t *lock);
    /* 读写锁的写入锁解锁 */
    void rwlock_unlock_write(rwlock_t *lock);

#ifdef __cplusplus
}
#endif // RWLOCK_FREERTOS_H